let isSocketClose = false // 是否关闭socket

const reconnectCount = 5 // 重连次数

const heartbeatInterval = '' // 心跳定时器

let socketTask = null // websocket对象

let againTimer = null// 断线重连定时器

const url = null

let onReFn = null

let onSucFn = null

let onErrFn = null

/**
 * sockeUrl：websocet的地址
 * onReceive：消息监听的回调
 * onErrorEvent：抛出错误的回调，且弹窗连接失败的提示框
 * onErrorSucceed：抛出成功回调，主要用于隐藏连接失败的提示框
 * */
const sokcet = (sockeUrl, onReceive, onErrorEvent, onErrorSucceed) => {
	      url = sockeUrl
			   onReFn = onReceive
			   onErrFn = onErrorEvent
			   onSucFn = onErrorSucceed
			   isSocketClose = false
	          // 判断是否有websocet对象，有的话清空
	           if (socketTask) {
				   socketTask.close()
				   socketTask = null
				   clearInterval(heartbeatInterval)
			   }

			   // WebSocket的地址
  // 【非常重要】必须确保你的服务器是成功的,如果是手机测试千万别使用ws://127.0.0.1:9099【特别容易犯的错误】
  let url = sockeUrl
  // 连接

  socketTask = uni.connectSocket({
    url: url,
    success(data) {
      console.log('websocket连接成功')
      clearInterval(againTimer)// 断线重连定时器
    },
    fail: (err) => {
      console.log('报错', err)
    }
  })

  // 连接打开
  socketTask.onOpen((res) => {
    console.log('WebSocket打开')
    clearInterval(againTimer)// 断线重连定时器
	  onErrorSucceed({ isShow: false }) // 用于提示框的隐藏
    heartbeatInterval && clearInterval(heartbeatInterval)
    // 10秒发送一次心跳

  })

				 // 监听连接失败
  socketTask.onError((err) => {
    console.log('WebSocket连接打开失败，请检查', err)
    // 停止发送心跳
    clearInterval(heartbeatInterval)
    // 如果不是人为关闭的话，进行重连
    if (!isSocketClose) {
      reconnect(url, onErrorEvent)
    }
  })

  // // 监听连接关闭 -
  socketTask.onClose((e) => {
    console.log('WebSocket连接关闭！')
    clearInterval(heartbeatInterval)
    if (!isSocketClose) {
      reconnect(url, onErrorEvent)
    }
  })

  // 监听收到信息
  socketTask.onMessage((res) => {
    uni.hideLoading()
    console.log(res, 'res监听收到信息')
    const serverData = res.data
    // 与后端规定好返回值分别代表什么，写业务逻辑

    serverData && onReceive(serverData)
  })

}

const reconnect = (url, onErrorEvent) => {
				 console.log('进入断线重连', isSocketClose)
				     clearInterval(againTimer)// 断线重连定时器
				     clearInterval(heartbeatInterval)
					 socketTask && socketTask.close() // 确保已经关闭后再重新打开
					 socketTask = null
  onErrorEvent({ isShow: true, messge: '扫描头服务正在连接...' })
  // 连接  重新调用创建websocet方法
  againTimer	= setInterval(() => {
					 sokcet(url, onReFn, onErrFn, onSucFn)
					 console.log('在重新连接中...')
				 }, 1000 * 5)

}

const sendMsg = (msg) => { // 向后端发送命令
  msg = JSON.stringify(msg)
  try {
    // 通过 WebSocket 连接发送数据
    socketTask.send({
      data: msg
    })
    console.log('消息发送')
  } catch (e) {
    if (isSocketClose) {
      return
    } else {
      reconnect(url, onErrFn)
    }

  }
}
// 关闭websocket【必须在实例销毁之前关闭,否则会是underfined错误】beforeDestroy() {websocetObj.stop();}

const stop = () => {
	     isSocketClose = true
  clearInterval(heartbeatInterval)
  clearInterval(againTimer)// 断线重连定时器
  socketTask.close() // 确保已经关闭后再重新打开
  socketTask = null
}

export const websocetObj = {
 	sokcet,
 	stop,
  sendMsg
}

